home *** CD-ROM | disk | FTP | other *** search
- /* Main network program - provides both client and server functions */
- #define HOSTNAMELEN 32 /* changed from 16 by Bdale 860812 */
- #include <stdio.h>
- #include <time.h>
- #include "config.h"
- #include "global.h"
- #include "mbuf.h"
- #include "socket.h"
- #include "iface.h"
- #include "ftpcli.h"
- #include "telnet.h"
- #include "ax25tnc.h"
- #include "remote.h"
- #include "session.h"
- #include "cmdparse.h"
- #include "ax25.h"
- #include "enet.h"
- #include "timer.h"
- #include "proc.h"
- #include "tty.h"
- #include "daemon.h"
-
- #ifdef ASY
- #include "asy.h"
- #include "slip.h"
- #endif
-
- #ifdef NRS
- #include "nrs.h"
- #endif
-
- #ifdef UNIX /* BSD or SYS5 */
- #include "unix.h"
- #endif
-
- #ifdef AMIGA
- #include "amiga.h"
- #endif
-
- #ifdef MAC
- #include "mac.h"
- #endif
-
- #ifdef MSDOS
- #include "asy.h"
- #endif
-
- #ifdef TRACE
- #include "trace.h"
- /* Dummy structure for loopback tracing */
- struct iface Loopback = { NULLIF, "loopback" };
- #endif
-
- extern struct cmds Cmds[],Startcmds[],Stopcmds[];
- extern struct daemon Daemons[];
- extern struct iface *Ifaces;
- extern char Version[];
- extern char Startup[]; /* File to read startup commands from */
- extern int Refuse_echo;
- extern int Unix_line_mode;
- extern struct cmds Attab[];
- extern struct iface *Ifaces;
- char *fgets(),*strncpy();
- struct mbuf *ttydriv();
- int cmdparse();
- void showtrace();
-
- FILE *Logfp;
- char Badhost[] = "Unknown host %s\n";
- char Hostname[HOSTNAMELEN];
- unsigned Nsessions = NSESSIONS;
- int16 Lport = 1001;
- char Prompt[] = "net> ";
- char Nospace[] = "No space!!\n"; /* Generic malloc fail message */
- struct mbuf *Hopper;
-
- #ifndef MSDOS /* PC uses F-10 key always */
- static char Escape = 0x1d; /* default escape character is ^] */
- #endif
-
- struct mbuf *Cmdq;
- struct proc *Cmdpp;
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- char *inbuf;
- FILE *fp;
- struct daemon *tp;
- struct mbuf *bp;
-
- kinit();
- ioinit();
- sockinit(40);
- Cmdpp = mainproc("cmdintrp");
- ttysetmode(TTY_ECHO|TTY_EDIT);
- printf("KA9Q Internet Protocol Package, v%s\n",Version);
- printf("Copyright 1989 by Phil Karn, KA9Q\n");
- fflush(stdout);
- Sessions = (struct session *)calloc(Nsessions,sizeof(struct session));
-
- /* Start background Daemons */
- for(tp=Daemons;;tp++){
- if(tp->name == NULLCHAR)
- break;
- newproc(tp->name,tp->stksize,tp->fp,0,NULLCHAR);
- }
-
- if(argc > 1){
- /* Read startup file named on command line */
- fp = fopen(argv[1],"r");
- } else {
- fp = fopen(Startup,"r");
- }
- if(fp != NULLFILE){
- inbuf = malloc(BUFSIZ);
- while(fgets(inbuf,BUFSIZ,fp) != NULLCHAR){
- cmdparse(Cmds,inbuf);
- }
- fclose(fp);
- free(inbuf);
- }
-
- /* Now loop forever, processing commands */
- for(;;){
- printf(Prompt);
- while(Cmdq == NULLBUF)
- pwait(&Cmdq);
- bp = dequeue(&Cmdq);
- (void)cmdparse(Cmds,bp->data);
- free_p(bp);
- ttysetmode(TTY_ECHO|TTY_EDIT);
- }
- }
- /* Keyboard input process */
- void
- keyboard()
- {
- int c;
- struct mbuf *bp;
-
- /* Keyboard process loop */
- for(;;){
- c = kbread();
- #ifndef MSDOS
- if(c == Escape && Escape != 0)
- c = -2;
- #endif
- /* c == -2 means the command escape key */
- if(c == -2){
- /* Save current tty mode and set cooked */
- if(Current != NULLSESSION){
- Current->ttymode = ttygetmode();
- Lastcurrent = Current;
- Current = NULLSESSION;
- ttysetmode(TTY_ECHO|TTY_EDIT);
- printf("\n");
- /* Wake up the command interpreter */
- alert(Cmdpp,0);
- }
- /* Else give to line editor; if done, queue it */
- } else if((bp = ttydriv(c)) != NULLBUF){
- if(Current != NULLSESSION)
- enqueue(&Current->input,bp);
- else
- enqueue(&Cmdq,bp);
- }
- }
- }
- /* Process packets in the Hopper */
- void
- network()
- {
- struct mbuf *bp;
- struct phdr phdr;
- char i_state;
-
- loop: i_state = dirps();
- while(Hopper == NULLBUF)
- pwait(&Hopper);
- restore(i_state);
-
- /* Process the input packet */
- bp = dequeue(&Hopper);
- pullup(&bp,(char *)&phdr,sizeof(phdr));
- dump(phdr.iface,IF_TRACE_IN,phdr.type,bp);
- switch(phdr.type){
- #ifdef AX25
- case TYPE_KISS:
- /* Toss the type field and handle as AX.25 */
- pullup(&bp,NULLCHAR,1); /*note fall-thru */
- case TYPE_AX25:
- ax_recv(phdr.iface,bp);
- break;
- #endif
- case TYPE_ETHER:
- eproc(phdr.iface,bp);
- break;
- case TYPE_IP:
- ip_route(bp,0);
- break;
- case TYPE_APPLETALK:
- default:
- free_p(bp);
- break;
- }
- goto loop;
- }
- /* Standard commands called from main */
- int
- doexit(argc,argv)
- int argc;
- char *argv[];
- {
- if(Logfp != NULLFILE)
- fclose(Logfp);
- iostop();
- exit(0);
- }
- int
- dohostname(argc,argv)
- int argc;
- char *argv[];
- {
- if(argc < 2)
- printf("%s\n",Hostname);
- else
- strncpy(Hostname,argv[1],HOSTNAMELEN);
- return 0;
- }
- int
- dolog(argc,argv)
- int argc;
- char *argv[];
- {
- static char logname[15];
-
- if(argc < 2){
- if(Logfp)
- printf("Logging to %s\n",logname);
- else
- printf("Logging off\n");
- return 0;
- }
- if(Logfp){
- fclose(Logfp);
- Logfp = NULLFILE;
- }
- if(strcmp(argv[1],"stop") != 0){
- strncpy(logname,argv[1],15);
- Logfp = fopen(logname,"a+");
- }
- return 0;
- }
- int
- dohelp(argc,argv)
- int argc;
- char *argv[];
- {
- register struct cmds *cmdp;
- int i,j;
-
- printf("Main commands:\n");
- for(i=0,cmdp = Cmds;cmdp->name != NULL;cmdp++,i++){
- printf("%s",cmdp->name);
- if((i % 4) == 3)
- printf("\n");
- else {
- for(j=strlen(cmdp->name);j < 16; j++)
- putchar(' ');
- }
- }
- if((i % 4) != 0)
- printf("\n");
- return 0;
- }
- int
- doecho(argc,argv)
- int argc;
- char *argv[];
- {
- if(argc < 2){
- if(Refuse_echo)
- printf("Refuse\n");
- else
- printf("Accept\n");
- } else {
- if(argv[1][0] == 'r')
- Refuse_echo = 1;
- else if(argv[1][0] == 'a')
- Refuse_echo = 0;
- else
- return -1;
- }
- return 0;
- }
- /* set for unix end of line for remote echo mode telnet */
- int
- doeol(argc,argv)
- int argc;
- char *argv[];
- {
- if(argc < 2){
- if(Unix_line_mode)
- printf("Unix\n");
- else
- printf("Standard\n");
- } else {
- if(strcmp(argv[1],"unix") == 0)
- Unix_line_mode = 1;
- else if(strcmp(argv[1],"standard") == 0)
- Unix_line_mode = 0;
- else {
- return -1;
- }
- }
- return 0;
- }
- /* Attach an interface
- * Syntax: attach <hw type> <I/O address> <vector> <mode> <label> <bufsize> [<speed>]
- */
- int
- doattach(argc,argv)
- int argc;
- char *argv[];
- {
- return subcmd(Attab,argc,argv);
- }
- /* Manipulate I/O device parameters */
- int
- doparam(argc,argv)
- int argc;
- char *argv[];
- {
- register struct iface *ifp;
-
- for(ifp=Ifaces;ifp != NULLIF;ifp = ifp->next){
- if(strcmp(argv[1],ifp->name) == 0)
- break;
- }
- if(ifp == NULLIF){
- printf("Interface \"%s\" unknown\n",argv[1]);
- return 1;
- }
- if(ifp->ioctl == NULLFP){
- printf("Not supported\n");
- return 1;
- }
- /* Pass rest of args to device-specific code */
- return (*ifp->ioctl)(ifp,argc-2,argv+2);
- }
- /* Log messages of the form
- * Tue Jan 31 00:00:00 1987 44.64.0.7:1003 open FTP
- */
- /*VARARGS2*/
- log(s,fmt,arg1,arg2,arg3,arg4)
- int s;
- char *fmt;
- int arg1,arg2,arg3,arg4;
- {
- char *cp;
- long t;
- int fd,i;
- struct sockaddr fsocket;
-
- if(Logfp == NULLFILE)
- return;
- time(&t);
- cp = ctime(&t);
- rip(cp);
- i = SOCKSIZE;
- fprintf(Logfp,"%s",cp);
- if(getpeername(s,(char *)&fsocket,&i) != -1)
- fprintf(Logfp," %s",psocket(&fsocket));
-
- fprintf(Logfp," - ");
- fprintf(Logfp,fmt,arg1,arg2,arg3,arg4);
- fprintf(Logfp,"\n");
- fflush(Logfp);
- #ifdef MSDOS
- /* MS-DOS doesn't really flush files until they're closed */
- fd = fileno(Logfp);
- if((fd = dup(fd)) != -1)
- close(fd);
- #endif
- }
- /* Configuration-dependent code */
-
- /* List of supported hardware devices */
- int ec_attach(),asy_attach(),pc_attach(),eg_attach(),hapn_attach(),at_attach(),
- nr_attach(),pk_attach(),hs_attach();
-
- struct cmds Attab[] = {
- #ifdef PC_EC
- /* 3-Com Ethernet interface */
- "3c500", ec_attach, 0, 7,
- "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu>",
- #endif
- #ifdef ASY
- /* Ordinary PC asynchronous adaptor */
- "asy", asy_attach, 0, 8,
- "attach asy <address> <vector> slip|ax25|nrs <label> <buffers> <mtu> <speed>",
- #endif
- #ifdef PC100
- /* PACCOMM PC-100 8530 HDLC adaptor */
- "pc100", pc_attach, 0, 8,
- "attach pc100 <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
- #endif
- #ifdef EAGLE
- /* EAGLE RS-232C 8530 HDLC adaptor */
- "eagle", eg_attach, 0, 8,
- "attach eagle <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
- #endif
- #ifdef HAPN
- /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
- "hapn", hapn_attach, 0, 8,
- "attach hapn <address> <vector> ax25 <label> <rx bufsize> <mtu> csma|full",
- #endif
- #ifdef APPLETALK
- /* Macintosh AppleTalk */
- "0", at_attach, 0, 7,
- "attach 0 <protocol type> <device> arpa <label> <rx bufsize> <mtu>",
- #endif
- #ifdef NETROM
- /* fake netrom interface */
- "netrom", nr_attach, 0, 1,
- "attach netrom",
- #endif
- #ifdef PACKET
- /* FTP Software's packet driver spec */
- "packet", pk_attach, 0, 4,
- "attach packet <int#> <label> <buffers> <mtu>",
- #endif
- #ifdef HS
- /* Special high speed driver for DRSI PCPA or Eagle cards */
- "hs", hs_attach, 0, 7,
- "attach hs <address> <vector> ax25 <label> <buffers> <mtu> <txdelay> <persistence>",
- #endif
- NULLCHAR, NULLFP, 0, 0,
- "Unknown device",
- };
-
- /* Protocol tracing function pointers */
- #ifdef TRACE
- int ax25_dump(),ether_dump(),ip_dump(),at_dump(),ki_dump();
-
- int (*Tracef[])() = {
- #ifdef AX25
- ax25_dump,
- #else
- NULLFP,
- #endif
-
- #ifdef ETHER
- ether_dump,
- #else
- NULLFP,
- #endif
- ip_dump,
-
- #ifdef APPLETALK
- at_dump,
- #else
- NULLFP,
- #endif
-
- #ifdef KISS
- ki_dump,
- #else
- NULLFP,
- #endif
- };
- #else /* TRACE */
- int (*Tracef[])() = { NULLFP }; /* No tracing at all */
- dump(iface,direction,type,bp)
- struct iface *iface;
- int direction;
- unsigned type;
- struct mbuf *bp;
- {
- }
- #endif /* TRACE */
-
- #ifndef NETROM
- #ifdef AX25
- struct ax25_addr Nr_nodebc;
- #endif /* AX25 */
- nr_route(bp)
- struct mbuf *bp;
- {
- free_p(bp);
- }
- nr_nodercv(bp)
- struct mbuf *bp;
- {
- free_p(bp);
- }
- #endif /* NETROM */
-
- /* Display or set IP interface control flags */
- domode(argc,argv)
- int argc;
- char *argv[];
- {
- register struct iface *ifp;
-
- for(ifp=Ifaces;ifp != NULLIF;ifp = ifp->next){
- if(strcmp(argv[1],ifp->name) == 0)
- break;
- }
- if(ifp == NULLIF){
- printf("Interface \"%s\" unknown\n",argv[1]);
- return 1;
- }
- if(argc < 3){
- printf("%s: %s\n",ifp->name,
- (ifp->flags & CONNECT_MODE) ? "VC mode" : "Datagram mode");
- return 0;
- }
- switch(argv[2][0]){
- case 'v':
- case 'c':
- case 'V':
- case 'C':
- ifp->flags = CONNECT_MODE;
- break;
- case 'd':
- case 'D':
- ifp->flags = DATAGRAM_MODE;
- break;
- default:
- printf("Usage: %s [vc | datagram]\n",argv[0]);
- return 1;
- }
- return 0;
- }
-
- #ifdef SERVERS
- dostart(argc,argv)
- int argc;
- char *argv[];
- {
- return subcmd(Startcmds,argc,argv);
- }
- dostop(argc,argv)
- int argc;
- char *argv[];
- {
- return subcmd(Stopcmds,argc,argv);
- }
- #endif SERVERS
-
- #ifdef TRACE
- int
- dotrace(argc,argv)
- int argc;
- char *argv[];
- {
- struct iface *ifp;
-
- if(argc < 2){
- showtrace(&Loopback);
- for(ifp = Ifaces; ifp != NULLIF; ifp = ifp->next)
- showtrace(ifp);
- return 0;
- }
- if(strcmp("loopback",argv[1]) == 0)
- ifp = &Loopback;
- else
- for(ifp = Ifaces; ifp != NULLIF; ifp = ifp->next)
- if(strcmp(ifp->name,argv[1]) == 0)
- break;
-
- if(ifp == NULLIF){
- printf("Interface %s unknown\n",argv[1]);
- return 1;
- }
- if(argc >= 3)
- ifp->trace = htoi(argv[2]);
-
- showtrace(ifp);
- return 0;
- }
- /* Display the trace flags for a particular interface */
- void
- showtrace(ifp)
- register struct iface *ifp;
- {
- if(ifp == NULLIF)
- return;
- printf("%s:",ifp->name);
- if(ifp->trace & (IF_TRACE_IN | IF_TRACE_OUT)){
- if(ifp->trace & IF_TRACE_IN)
- printf(" input");
- if(ifp->trace & IF_TRACE_OUT)
- printf(" output");
-
- if(ifp->trace & IF_TRACE_HEX)
- printf(" (Hex/ASCII dump)");
- else if(ifp->trace & IF_TRACE_ASCII)
- printf(" (ASCII dump)");
- else
- printf(" (headers only)");
- printf("\n");
- } else
- printf(" tracing off\n");
- }
- #endif /* TRACE */
-
- #ifndef MSDOS
- static
- int
- doescape(argc,argv)
- int argc;
- char *argv[];
- {
- if(argc < 2)
- printf("0x%x\n",Escape);
- else
- Escape = *argv[1];
- return 0;
- }
- #endif MSDOS
- int
- doremote(argc,argv)
- int argc;
- char *argv[];
- {
- struct sockaddr_in fsock;
- int s;
- char data;
- extern int errno;
-
- fsock.sin_family = AF_INET;
- fsock.sin_addr.s_addr = resolve(argv[1]);
- fsock.sin_port = atoi(argv[2]);
-
- if(strcmp(argv[3],"reset") == 0){
- data = SYS_RESET;
- } else if(strcmp(argv[3],"exit") == 0){
- data = SYS_EXIT;
- } else {
- printf("Unknown command %s\n",argv[3]);
- return 1;
- }
- if((s = socket(AF_INET,SOCK_DGRAM,0)) == -1){
- printf("socket failed\n");
- return 1;
- }
- if(sendto(s,&data,1,0,(char *)&fsock,sizeof(fsock)) == -1){
- printf("sendto failed, errno %d\n",errno);
- close_s(s);
- return 1;
- }
- close_s(s);
- return 0;
- }
-
-